sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js
  2. [번역] Creating a HTTP Server in Node.js

원문 sitepoint.comHTTP Authentication in Node.js(http://sitepoint.com/http-authentication-in-node-js/)

오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

HTTP Authentication in Node.js

지난주 Creating a HTTP Server in Node.js에서 Node.js의 기본적인 HTTP에 대해서 알아 보았다. 오늘은 Node.js로 만든 사이트를 HTTP 인증을 사용하여 암호로 보호하는 방법을 보여줄 것이다. 먼저 기본접근인증(basic access authentication)에 대해서 살펴본 후 더 안전한 요약접근인증(digest access authentication)에 대해서 알아볼 것이다.

Basic Access Authentication

인증이 적용되어 있는 사이트에 사용자가 방문을 하면 사용자명과 비밀번호를 요구하는 입력창이 나타난다. 사용자가 유효한 자격증명(사용자명과 비밀번호)을 제공하면 페이지의 콘텐츠를 보게 되고 아니면 “401 Unauthorized” 응답으로 거부될 것이다. HTTP 인증의 가장 간단한 유형은 기본접근인증이다.

The Password File

서버측에는 모든 사용자명과 암호화된 비밀번호가 패스워드 파일에 저장되어 있다. Node.js의 유틸리티 모듈인 htpasswd는 패스워드 파일을 관리하는 데 사용할 수 있다. htpasswd를 설치하려면 아래의 명령어를 사용한다. npmNode.js Package Manager를 의미하며 Node.js에 기본적으로 설치되어 있다. 아래의 명령에서 npm은 Node.js 모듈을 설치하기 위해 사용하며 -g 플래그는 패키지를 전역적(시스템의 PATH 환경변수에 포함되어 있는)으로 설치하게 한다.

$ npm install -g htpasswd

일단 htpasswd가 설치되면 아래의 명령어를 사용하여 새로운 사용자를 생성할 수 있다. 이 예제는 -c 플래그를 사용하여 “htpasswd”라는 이름의 새로운 패스워드 파일을 생성한다. 새로운 파일에는 “foo”라는 이름의 사용자가 추가된다. -b 플래그는 명령행의 일부로 지정한 “bar”를 비밀번호로 설정하게 한다.

$ htpasswd -bc htpasswd foo bar

위 명령을 실행한 후 “htpasswd” 파일을 열어보자. “foo”라는 사용자에 대한 패스워드 파일 항목이 아래와 같이 보일 것이다. 이 행에는 사용자명과 암호화된 비밀번호가 포함되어 있으며 이것이 처음이자 유일한 사용자이기 때문에 파일에는 단 한줄만 있게 된다.

foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=

Node.js Incorporation

다음 단계는 우리의 HTTP 서버에 인증이 지원되도록 추가하는 것이다. 우선은 다음에 나오는 npm 명령을 사용하여 http-auth 모듈을 설치해야만 한다.

$ npm install http-auth

다음으로 “basic_auth_server.js”라는 새로운 파일을 만들고 아래의 코드를 입력하자. 2 라인에서는 http-auth 모듈을 참조하고 있다는 것을 알 수 있다. 3 라인부터 7 라인까지를 보면 구성 객체를 인증 모듈로 전달하고 있다. authRealm 필드는 인증 영역을 정의한다. authFile 필드는 방금 만든 패스워드 파일을 가르킨다. 여기에서 __dirname은 현재 실행중인 스크립트가 존재하는 디렉토리를 참조한다. 이 예제에서는 “htpasswd” 파일이 “basic_auth_server.js”와 같은 디렉토리에 있다고 가정한다. authType 구성 필드는 인증에 사용하는 유형이 무엇인지를 나타낸다. 9 라인에서 기본인증 방식으로 HTTP 연결에 적용되었다. 인증 콜백 함수는 다음 처리를 위해 인증된 사용자명을 제공한다.

var http = require("http");
var auth = require("http-auth");
var basic = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "basic"
});
var server = http.createServer(function(request, response) {
  basic.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

마지막으로 서버를 시작한다. http://localhost 로 서버에 연결할 수 있다. 그러면 사용자명과 비밀번호의 입력창이 나타날 것이다. 앞에서 만든 자격증명을 제공하면 브라우저는 이름과 함께 인사(“Hello foo”)하며 응답할 것이다.

Limitations

기본접근인증의 가장 큰 단점은 자격증명(사용자명과 비밀번호)이 네트워크상에서 평문으로 전송된다는 사실이다. 이와 같은 유형의 인증은 감청을 막기 위해서 보안 연결(예: HTTPS)상에서만 사용해야 한다. 만약 보안 연결이 제공될 수 없다면 기본접근인증 대신에 더 안전한 형식의 인증을 사용해야만 한다.

Digest Access Authentication

요약접근인증은 기본인증에 대한 더욱 안전한 대안이다. 요약인증에서는 비밀번호가 네트워크 전송 전에 암호화된다.

The Password File

요약인증에서도 패스워드 파일을 사용한다. 하지만, 기본인증에서 사용하던 형식과 조금 다르다. 요약인증의 패스워드 파일 형식으로 운영하기 위해 htdigest라는 다른 유틸리티 모듈을 사용할 것이다. 다음의 npm 명령으로 htdigest를 설치하자.

$ npm install -g htdigest

다음으로 아래 보이는 명령어를 사용하여 새로운 패스워드 파일을 생성하자. 역시나 -c 플래그는 “htpasswd”라는 새로운 패스워드 파일을 생성하기위해 사용한다. 이제는 인증 영역 또한 명시해야만 한다. 이번 경우에는 인증 영역을 “Private area”로 지정한 것이다. 이 예제도 사용자명은 “foo”이다. 비밀번호를 명령행에서 직접 지정하지 않은 것을 주목하자. 명령을 실행하자마자 비밀번호를 요구하는 메시지가 나올 것이다.

$ htdigest -c htpasswd "Private area" foo

htdigest 명령을 실행한 후에 새로 생성된 “htpasswd” 파일의 내용을 확인해 보자. “foo”라는 사용자에 대한 항목이 아래처럼 보일 것이다. 요약인증 파일은 사용자명과 암호화된 비밀번호, 그리고 기본인증 파일에는 포함되지 않았던 인증 영역까지 포함하고 있다.

foo:Private area:b8e1b1c08abcd38173a7dba3ad93a0c3

Node.js Incorporation

서버에 요약인증을 통합하기 위해 우리는 다시 http-auth 모듈을 사용할 것이다. 이 튜토리얼을 잘 따라왔다면 그 모듈은 이미 설치가 되어있어야 한다. 다음은 서버를 구현하기 위한 “digest_auth_server.js”라는 새로운 파일을 생성하자. 서버의 코드는 아래 보이는 것과 같다. 이 서버 코드가 기본인증의 서버 코드와 거의 동일한 것을 주목하자. 차이점은 구성 객체의 authType 필드에 있다. 이 경우에는 authType“digest”로 설정되었다. 이 서버에도 기본인증 서버와 동일한 방식으로 접근할 수 있다.

var http = require("http");
var auth = require("http-auth");
var digest = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "digest"
});
var server = http.createServer(function(request, response) {
  digest.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});
server.listen(80);
console.log("Server is listening");

Conclusion

이번 글에서는 기본적인 HTTP 인증에 대해서 다루었다. 여기에서 제공하는 예제를 따라함으로써 여러분의 Node.js 애플리케이션들을 조금 더 안전하게 만들 수 있다. 하지만, 인증 하나만으로는 충분하지 않다는 것을 알아야만 한다. 만약 보안이 우선 관심사라면 여러분의 사이트는 HTTPS를 통해 서비스를 해야만 한다. 앞으로의 글들에는 HTTPS 및 여러 다른 놀라운 Node.js의 특징들에 대해서 살펴볼 것이다.


About Author

Juhoi Kim
blog: http://juhoi.github.io
twitter: @ByJuhoi
github: juhoi

모든 것은 나의 선택에 달려있다.